package com.station.Activitys.activity;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.station.Activitys.R;
import com.station.Activitys.activity.base.BaseActivity;
import com.station.Activitys.bean.State;
import com.station.Activitys.bean.UploadImage;
import com.station.Activitys.http.manager.UserManager;
import com.station.Activitys.other.matisse.GifSizeFilter;
import com.station.Activitys.other.matisse.Glide4Engine;
import com.station.Activitys.utils.CacheManger;
import com.station.Activitys.utils.Constant;
import com.station.Activitys.utils.FileUtils;
import com.station.Activitys.utils.GlideUtils;
import com.station.Activitys.utils.LogUtils;
import com.station.Activitys.utils.ToastUtils;
import com.yalantis.ucrop.UCrop;
import com.zhihu.matisse.Matisse;
import com.zhihu.matisse.MimeType;
import com.zhihu.matisse.filter.Filter;
import com.zhihu.matisse.internal.entity.CaptureStrategy;

import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.io.File;
import java.io.IOException;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;
import io.github.lizhangqu.coreprogress.ProgressHelper;
import io.github.lizhangqu.coreprogress.ProgressUIListener;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * 项目名称：基站管理平台 手机app
 * 类描述：我的资料
 * 创建人：张飞祥
 * 创建时间：2018/9/7 11:06
 * 修改人：张飞祥
 * 修改时间：2018/9/7 11:06
 * 修改备注：
 */
public class MyDataActivity extends BaseActivity {

    //返回按钮
    @Bind(R.id.iv_return) ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title) TextView tvTitle;
    //文字功能栏
    @Bind(R.id.tv_function) TextView tvFunction;

    //头像
    @Bind(R.id.iv_my_icon) ImageView ivMyIcon;
    //姓名
    @Bind(R.id.tv_my_name) TextView tvMyName;
    //职位
    @Bind(R.id.tv_my_job) TextView tvMyJob;

    //TODO 变量
    //头像上传 返回的 url
    private String mUploadUrl = "";
    //TODO 初始化网络请求
    public UserManager mApiManager;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_my_data);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this, this.getTaskId());

        //标题
        tvTitle.setText("我的资料");
        //返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //功能按钮
        tvFunction.setText("修改");
        tvFunction.setVisibility(View.VISIBLE);
    }

    @Override
    protected void initData() {
        //获取当用实体类
        mUser = CacheManger.getUser(mACache);
        //TODO 配置当前用户数据
        if (mUser != null) {
            //头像
            GlideUtils.loadCircleImage(this, mUser.getImgUrl(), ivMyIcon);
            //用户名称
            tvMyName.setText(mUser.getRealName());
            //职位
            tvMyJob.setText(mUser.getJob());
        }
    }

    /**
     * 按钮点击事件
     *
     * @return
     */
    @OnClick({R.id.iv_return, R.id.tv_function,R.id.layout_user_icon,
            R.id.layout_user_name,R.id.layout_user_job,})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.iv_return:               //返回
                finish();
                break;

            case R.id.tv_function:             //完成修改
                setUserInfoSubmit();
                break;

            case R.id.layout_user_icon:        //修改用户头像
                selectPicture();
                break;

            case R.id.layout_user_name:        //修改用户名称
                new MaterialDialog.Builder(this).title("请输入姓名")
                        .positiveText("确认")
                        .negativeText("取消")
                        .input("", tvMyName.getText(), false, new MaterialDialog.InputCallback() {
                            @Override
                            public void onInput(MaterialDialog dialog, CharSequence input) {
                                tvMyName.setText(input.toString());
                            }
                        }).show();
                break;

            case R.id.layout_user_job:         //修改用户职位
                new MaterialDialog.Builder(this).title("请输入职位")
                        .positiveText("确认")
                        .negativeText("取消")
                        .input("", tvMyJob.getText(), false, new MaterialDialog.InputCallback() {
                            @Override
                            public void onInput(MaterialDialog dialog, CharSequence input) {
                                tvMyJob.setText(input.toString());
                            }
                        }).show();
                break;
        }
    }

    /**
     * 修改用户信息
     */
    private void setUserInfoSubmit() {
        //姓名
        String name = tvMyName.getText().toString();
        //职位
        String job = tvMyJob.getText().toString();

        //TODO 填充用户信息
        //头像
        if (!mUploadUrl.equals(""))
            mUser.setImgUrl(Constant.HTTP_URL+mUploadUrl);

        //姓名
        mUser.setRealName(name);
        //职位
        mUser.setJob(job);

        //TODO 开始网络请求
        initShowTimeDialog("正在修改用户信息，请稍候....", this);
        mApiManager.userUpdateMsg(mUser.getId(),mUploadUrl,name,job);
    }

    /**
     * 网络请求 修改用户信息 报错
     */
    @Subscriber(tag = Constant.BUS_MY_UPDATE_MSG_ERROR, mode = ThreadMode.MAIN)
    public void initUpdatePwdError(String strError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                mTimeDialog.dismiss();
                //弹出相应的提示
                ToastUtils.showShort(MyDataActivity.this,"网络连接不稳定，请稍后重试！！！");
            }
        }, 1000);
    }

    /**
     * 网络请求 修改用户信息
     */
    @Subscriber(tag = Constant.BUS_MY_UPDATE_MSG, mode = ThreadMode.MAIN)
    public void initUpdatePwd(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                mTimeDialog.dismiss();
                //弹出相应的提示
                ToastUtils.showShort(MyDataActivity.this, state.getMsg());
                //TODO 网络请求业务逻辑判断
                if (state.getState().equals("1")) {
                    //TODO 将当前用户实体存储在 本地
                    mACache.put(Constant.CACHE_USER, new Gson().toJson(mUser));
                    //发送消息 到 MyFragment 更新数据
                    EventBus.getDefault().post("push",Constant.BUS_APP_PUSH);
                    //销毁当前页面
                    finish();
                }

            }
        }, 1000);
    }

    /**
     * 调用相册列表
     */
    private void selectPicture() {
        /**
         * 动态申请权限 否则不调用相机
         *
         * true： --------> 让用户手动设置 给予权限
         * false：--------> 跳转图片选择页面
         *
         */
        String[] PERMISSIONS_STORAGE = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_SETTINGS
        };
        int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, Constant.REQUEST_EXTERNAL_STORAGE);
        } else {
            Matisse.from(this)
                    .choose(MimeType.ofImage())
                    .countable(false)
                    .capture(true)
                    .captureStrategy(
                            new CaptureStrategy(true, Constant.APP_FILE_PATH))
                    .maxSelectable(1)
                    .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
                    .gridExpectedSize(this.getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
                    .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
                    .thumbnailScale(0.85f)
                    .imageEngine(new Glide4Engine())
                    .forResult(Constant.REQUEST_CAMERA_PHOTO);
        }
    }

    /**
     * 图片处理返回页面
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        //TODO 选择之后的 图片 url 返回
        if (resultCode == Activity.RESULT_OK) {
            /**
             * 1.是否已经点击确认了
             * 2.获取返回 的 url 集合
             */
            if (requestCode == Constant.REQUEST_CAMERA_PHOTO) {
                //TODO 获取当前图片路径 转成 URi的形式
                List<String> path = Matisse.obtainPathResult(data);
                //TODO 传递到图片裁剪器
                //需要裁剪的图片路径
                Uri sourceUri = Uri.fromFile(new File(path.get(0)));
                //裁剪完毕的图片存放路径
                Uri destinationUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "ic_user_img.jpg"));

                //TODO 创建 裁剪参数
                UCrop uCrop = UCrop.of(sourceUri, destinationUri);
                UCrop.Options options = new UCrop.Options();
                //裁剪 比例
                uCrop.withAspectRatio(1, 1);
                //是否能调整裁剪框
                options.setFreeStyleCropEnabled(true);
                //标题栏颜色
                options.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary));
                //设置状态栏颜色
                options.setStatusBarColor(ActivityCompat.getColor(this, R.color.colorPrimaryDark));
                //标题栏 按钮颜色
                options.setToolbarWidgetColor(ContextCompat.getColor(this, R.color.color_white));
                //底部控件 按钮颜色
                options.setActiveWidgetColor(ContextCompat.getColor(this, R.color.color_blue));
                //圆形裁剪
                options.setCircleDimmedLayer(true);
                //添加 裁剪参数
                uCrop.withOptions(options);

                //TODO 跳转裁剪页面
                uCrop.start(this);
            }

            //TODO 裁剪后的图片
            if (requestCode == UCrop.REQUEST_CROP) {
                //获取 裁剪后 图片的 Uri
                Uri resultUri = UCrop.getOutput(data);
                //弹出 dialog
                initShowTimeDialog("准备上传 0% ，请稍候....", this);
                //网络请求 上传头像
                uploadFile(resultUri);
            }
            //TODO 裁剪图片 出错
            else if (resultCode == UCrop.RESULT_ERROR) {
                final Throwable cropError = UCrop.getError(data);
                ToastUtils.showShort(this,"图片裁剪时出错！可能当前设备不支持裁剪！");
            }
        }
    }

    /**
     * 文件上传 带进度 （okHttp）
     *
     * @param uri
     */
    private void uploadFile(final Uri uri) {
        //获取 要上传的 文件 path
        String filePath = FileUtils.getRealFilePath(MyDataActivity.this, uri);
        //添加要上传的文件
        File uploadFile = new File(filePath);
        //要上传的 地址
        String url = Constant.HTTP_URL + "UserInfo/UpLoadImg";

        //TODO 创建一个 okHttp 请求
        OkHttpClient okHttpClient = new OkHttpClient();

        //TODO 创建 一个 bodyBuilder
        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder();
        bodyBuilder.setType(MultipartBody.FORM);

        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是file
        //此处应该改变
        bodyBuilder.addFormDataPart("file", uploadFile.getName(), RequestBody.create
                (MediaType.parse("application/octet-stream"), uploadFile));
        //构建
        MultipartBody multipartBody = bodyBuilder.build();

        //TODO  获取 上传进度
        RequestBody requestBody = ProgressHelper.withProgress(multipartBody, new ProgressUIListener() {
            @Override
            public void onUIProgressStart(long totalBytes) {
                super.onUIProgressStart(totalBytes);
                LogUtils.i("uploadFile：--------------->开始上传");
            }

            @Override
            public void onUIProgressChanged(long numBytes, long totalBytes, final float percent, float speed) {
                //获取 当前上传 进度
                int progress = (int) (100 * percent);
                //进度 判断 显示
                if (progress < 100)
                    mTimeDialog.setContent("已经上传 " + progress + "% ，请稍候....");

                LogUtils.i("uploadFile：--------------->" + (int) (100 * percent));
            }

            @Override
            public void onUIProgressFinish() {
                super.onUIProgressFinish();
                LogUtils.i("uploadFile：--------------->结束上传");
            }
        });

        //创建Request
        Request request = new Request.Builder().url(url).post(requestBody).build();

        //TODO 获取当前网络请求状态
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            //请求出错
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            //请求成功 返回结果
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //得到服务器返回的具体内容
                String responseData = response.body().string();
                //开始解析 转换为 实体数据
                Gson gson = new Gson();
                UploadImage image = gson.fromJson(responseData + "", UploadImage.class);
                //TODO 网络请求业务逻辑判断
                if (image.getState().equals("1")) {
                    //销毁dialog
                    mTimeDialog.dismiss();
                    //设置返回来的 头像路径
                    mUploadUrl = image.getSrc();
                    //在主线程中调用加载头像
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //更新显示头像
                            GlideUtils.loadCircleImage(MyDataActivity.this,Constant.HTTP_URL+mUploadUrl, ivMyIcon);
                        }
                    });
                } else {
                    ToastUtils.showShort(MyDataActivity.this, image.getMsg());
                }
            }
        });
    }

}
